# import turtle as t  # as就是取个别名，后续调用的t都是turtle
# from turtle import *
# import random as r
# import time
#
# n = 100.0
#
# speed("fastest")  # 定义速度
# screensize(bg='black')  # 定义背景颜色，可以自己换颜色
# left(90)
# forward(3 * n)
# color("orange", "yellow")  # 定义最上端星星的颜色，外圈是orange，内部是yellow
# begin_fill()
# left(126)
#
# for i in range(5):  # 画五角星
#     forward(n / 5)
#     right(144)  # 五角星的角度
#     forward(n / 5)
#     left(72)  # 继续换角度
# end_fill()
# right(126)
#
#
# def drawlight():  # 定义画彩灯的方法
#     if r.randint(0, 30) == 0:  # 如果觉得彩灯太多，可以把取值范围加大一些，对应的灯就会少一些
#         color('tomato')  # 定义第一种颜色
#         circle(6)  # 定义彩灯大小
#     elif r.randint(0, 30) == 1:
#         color('orange')  # 定义第二种颜色
#         circle(3)  # 定义彩灯大小
#     else:
#         color('dark green')  # 其余的随机数情况下画空的树枝
#
#
# color("dark green")  # 定义树枝的颜色
# backward(n * 4.8)
#
#
# def tree(d, s):  # 开始画树
#     if d <= 0: return
#     forward(s)
#     tree(d - 1, s * .8)
#     right(120)
#     tree(d - 3, s * .5)
#     drawlight()  # 同时调用小彩灯的方法
#     right(120)
#     tree(d - 3, s * .5)
#     right(120)
#     backward(s)
#
#
# tree(15, n)
# backward(n / 2)
#
# for i in range(200):  # 循环画最底端的小装饰
#     a = 200 - 400 * r.random()
#     b = 10 - 20 * r.random()
#     up()
#     forward(b)
#     left(90)
#     forward(a)
#     down()
#     if r.randint(0, 1) == 0:
#         color('tomato')
#     else:
#         color('wheat')
#     circle(2)
#     up()
#     backward(a)
#     right(90)
#     backward(b)
#
# t.color("dark red", "red")  # 定义字体颜色
# t.write("Merry Christmas ", align="center", font=("Comic Sans MS", 40, "bold"))  # 定义文字、位置、字体、大小
#
#
# def drawsnow():  # 定义画雪花的方法
#     t.ht()  # 隐藏笔头，ht=hideturtle
#     t.pensize(2)  # 定义笔头大小
#     for i in range(200):  # 画多少雪花
#         t.pencolor("white")  # 定义画笔颜色为白色，其实就是雪花为白色
#         t.pu()  # 提笔，pu=penup
#         t.setx(r.randint(-350, 350))  # 定义x坐标，随机从-350到350之间选择
#         t.sety(r.randint(-100, 350))  # 定义y坐标，注意雪花一般在地上不会落下，所以不会从太小的纵座轴开始
#         t.pd()  # 落笔，pd=pendown
#         dens = 6  # 雪花瓣数设为6
#         snowsize = r.randint(1, 10)  # 定义雪花大小
#         for j in range(dens):  # 就是6，那就是画5次，也就是一个雪花五角星
#             # t.forward(int(snowsize))  #int（）取整数
#             t.fd(int(snowsize))
#             t.backward(int(snowsize))
#             # t.bd(int(snowsize))  #注意没有bd=backward，但有fd=forward，小bug
#             t.right(int(360 / dens))  # 转动角度
#
#
# drawsnow()  # 调用画雪花的方法
# t.done()  # 完成,否则会直接关闭

import numpy as np
import random
from PIL import Image
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei'] # 步骤一（替换sans-serif字体）
plt.rcParams['axes.unicode_minus'] = False   # 步骤二（解决坐标轴负数的负号显示问题）

def F(X):
    #np.heaviside()为阶跃函数
    X=np.heaviside(X,1)
    return X

def Noise(X,K):
    rownumber = X.shape[0]
    listnumber = X.shape[1]
    N = rownumber * listnumber
    Changenumber = int(N*K) #取整
    #将数组展平
    X = X.reshape(1,N)
    # 在0-(N-1)中 随机取Changenumber个数字
    a = [random.randint(0, N-1) for i in range(Changenumber)]
    for i in a:
        value = X[0,i]
        if value == -1:
            X[0,i] = 1
        else:
            X[0,i] = -1
    return X

one=[-1,-1 ,-1, 1 ,1, 1, 1 ,-1, -1, -1 ,-1 ,-1, -1, 1 ,1 ,1 ,1 ,-1 ,-1 ,-1 ,-1, -1, -1 ,1, 1, 1 ,1, -1,
     -1, -1 ,-1 ,-1, -1, 1, 1, 1 ,1 ,-1 ,-1, -1, -1, -1, -1 ,1, 1 ,1 ,1, -1, -1 ,-1 ,-1 ,-1 ,-1, 1, 1, 1, 1, -1,
     -1, -1, -1, -1, -1, 1, 1, 1, 1, -1, -1, -1, -1, -1, -1, 1, 1, 1, 1, -1, -1, -1, -1, -1, -1, 1, 1, 1, 1, -1,
     -1 ,-1 ,-1 ,-1 ,-1,1, 1, 1, 1, -1 ,-1 ,-1]
two=[1, 1, 1, 1, 1, 1, 1, 1, -1, -1, 1, 1, 1, 1, 1, 1, 1, 1, -1, -1, -1, -1, -1, -1, -1, -1, 1, 1, -1,
     -1, -1, -1, -1, -1, -1, -1, 1, 1, -1, -1, 1, 1, 1, 1 ,1, 1 ,1 ,1 ,-1, -1, 1 ,1 ,1 ,1 ,1, 1 ,1 ,1 ,-1 ,-1, 1,
     1, -1 ,-1 ,-1 ,-1,-1 ,-1, -1, -1, 1, 1, -1, -1, -1 ,-1 ,-1, -1, -1, -1 ,1, 1, 1, 1, 1, 1, 1, 1 ,-1, -1 ,1,
     1, 1 ,1 ,1, 1, 1 ,1, -1, -1]

one = np.array(one).reshape((10,10))
two = np.array(two).reshape((10,10))
ONE = np.array(one).reshape((1,100))
TWO = np.array(two).reshape((1,100))

W = np.matmul(ONE.T,ONE) + np.matmul(TWO.T,TWO) - 2*np.identity(100)

#设置噪声强度比例
K=0.3
NoiseONE = Noise(ONE,K)
NoiseTWO = Noise(TWO,K)
print(NoiseONE.reshape(10,10))
print(NoiseTWO.reshape(10,10))
ONE = 2*np.matmul(W,NoiseONE.T).reshape((10,10))-1
TWO = 2*np.matmul(W,NoiseTWO.T).reshape((10,10))-1

print(F(ONE))
print(F(TWO))
Image_one = Image.fromarray(256*one) #数字1参考数组
Image_two = Image.fromarray(256*two) #数字2参考数组
Image_NoiseONE = Image.fromarray(256*NoiseONE.reshape(10,10)) #噪声数字1参考数组
Image_NoiseTWO = Image.fromarray(256*NoiseTWO.reshape(10,10)) #噪声数字2参考数组
Image_ONE = Image.fromarray(256*ONE) #数字1识别数组
Image_TWO = Image.fromarray(256*TWO) #数字2识别数组

plt.figure()
plt.suptitle("噪声为%s"%K)
plt.subplot(3,2,1)
plt.title("数字1")
plt.xticks([])
plt.yticks([])
plt.imshow(Image_one)

plt.subplot(3,2,2)
plt.title("数字2")
plt.xticks([])
plt.yticks([])
plt.imshow(Image_two)

plt.subplot(3,2,3)
plt.title("噪声数字1")
plt.xticks([])
plt.yticks([])
plt.imshow(Image_NoiseONE)

plt.subplot(3,2,4)
plt.title("噪声数字2")
plt.xticks([])
plt.yticks([])
plt.imshow(Image_NoiseTWO)

plt.subplot(3,2,5)
plt.title("识别数字1")
plt.xticks([])
plt.yticks([])
plt.imshow(Image_ONE)

plt.subplot(3,2,6)
plt.title("识别数字2")
plt.xticks([])
plt.yticks([])
plt.imshow(Image_TWO)

plt.tight_layout()
# plt.savefig('/Users/Monks/Desktop/计算智能/noise=%s.png'%K,dpi=300)
plt.show()